from typing import Union
from mcp.server.fastmcp import FastMCP

# 创建 MCP 服务实例
mcp = FastMCP("数学计算服务")
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

from pydantic.v1 import validate_arguments

@validate_arguments
@mcp.tool(name="add")
def add(a: Union[int, float], b: Union[int, float]) -> Union[int, float]:
    if not isinstance(a, (int, float)) or not isinstance(b, (int, float)):
        raise ValueError("参数必须是数字类型")
    return a + b

@mcp.tool(name="subtract")
def subtract(a: Union[int, float], b: Union[int, float]) -> Union[int, float]:
    """减法运算
    
    Args:
        a: 被减数
        b: 减数
        
    Returns:
        两数之差
    """
    return a - b

@mcp.tool(name="multiply")
def multiply(a: Union[int, float], b: Union[int, float]) -> Union[int, float]:
    """乘法运算
    
    Args:
        a: 第一个因数
        b: 第二个因数
        
    Returns:
        两数之积
    """
    return a * b

@mcp.tool(name="divide")
def divide(a: Union[int, float], b: Union[int, float]) -> Union[float, str]:
    """除法运算
    
    Args:
        a: 被除数
        b: 除数
        
    Returns:
        两数之商或错误信息
    """
    try:
        if b == 0:
            return "错误: 除数不能为零"
        return a / b
    except Exception as e:
        return f"计算错误: {str(e)}"

@mcp.tool(name="power")
def power(base: Union[int, float], exponent: Union[int, float]) -> Union[int, float]:
    """幂运算
    
    Args:
        base: 底数
        exponent: 指数
        
    Returns:
        幂计算结果
    """
    return base ** exponent

@mcp.tool(name="sqrt")
def sqrt(x: Union[int, float]) -> float:
    """平方根运算
    
    Args:
        x: 被开方数
        
    Returns:
        平方根结果
    """
    import math
    return math.sqrt(x)

if __name__ == "__main__":
    mcp.run()